#图片采集程序
import cv2  
import numpy as np  
import time  
import os 

# 创建 VideoCapture 对象，参数 0 表示默认摄像头  
cap = cv2.VideoCapture(0)  

# 设置分辨率  
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)  # 设置帧宽度为 1920 像素  
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)  # 设置帧高度为 1080 像素  

# 检查摄像头是否成功打开  
if not cap.isOpened():  
    print("无法打开摄像头")  
    exit()  

# 创建窗口并设置大小  
window_width = 1080 
window_height = 1080 
cv2.namedWindow('Camera', cv2.WINDOW_NORMAL)  # 创建可调整大小的窗口  
cv2.resizeWindow('Camera', window_width, window_height,cv2.WINDOW_FULLSCREEN)  # 设置窗口大小满屏

# 计算窗口的位置，使其在屏幕中间显示  
screen_width = 1920  # 假设屏幕宽度为 1920 像素  
screen_height = 1080  # 假设屏幕高度为 1080 像素  
window_x = int((screen_width - window_width) / 2)  
window_y = int((screen_height - window_height) / 2)  

# 移动窗口到屏幕中间  
cv2.moveWindow('Camera', window_x, window_y)  

# 初始化拍照的时间  
last_capture_time = time.time()  

# 确保目录存在 
save_directory = '/home/ljd/ljd/picture/' 
os.makedirs(save_directory, exist_ok=True) 

# 初始化图片计数器 
image_counter = 0 

while True:  
    # 捕获一帧  
    ret, frame = cap.read()  

    # 检查是否成功捕获帧  
    if not ret:  
        print("无法获取帧")  
        break  

    # 将 BGR 转换为 RGB  
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  

    # 获取当前帧的高度和宽度  
    height, width, _ = frame_rgb.shape  

    # 裁剪或缩放帧到 1080x1080  
    if width > height:  # 宽度大于高度，裁剪宽度 
        crop_x = (width - height) // 2 
        frame_cropped = frame_rgb[:, crop_x:crop_x + height] 
    else:  # 高度大于宽度或相等，裁剪高度 
        crop_y = (height - width) // 2 
        frame_cropped = frame_rgb[crop_y:crop_y + width, :] 

    # 确保输出为 1080x1080 
    frame_resized = cv2.resize(frame_cropped, (window_width, window_height))  

    # 在窗口中显示捕获的帧  
    cv2.imshow('Camera', frame_resized)  

    # 获取当前时间  
    current_time = time.time()  

    # 每 300 毫秒拍一张照片  
    if current_time - last_capture_time >= 0.3:  # 每隔 0.3 秒  
        # 获取当前时间并格式化为字符串
        current_time_str = time.strftime("%Y%m%d_%H%M%S", time.localtime())  
        # 直接保存当前显示的帧
        image_filename = f'captured_image_{current_time_str}_{image_counter}.jpg' 
        image_path = os.path.join(save_directory, image_filename) 

        # 保存当前帧为图片 
        cv2.imwrite(image_path, frame_resized)  
        print(f"拍照成功！图片分辨率: {window_width} x {window_height}，保存路径: {image_path}")  

        # 更新拍照时间和计数器 
        last_capture_time = current_time  
        image_counter += 1  # 增加计数器 

    # 按 'q' 键退出  
    key = cv2.waitKey(1) & 0xFF  
    if key == ord('q'):  
        break  

# 释放摄像头并关闭所有窗口  
cap.release()  
cv2.destroyAllWindows()
